#!/bin/bash

# 颜色输出函数
f_echo(){
    echo -e "\033[$1m$2\033[0m"
}

# 参数检查
if [ "$#" -ne 6 ]; then
    f_echo 31 "参数错误，请按照如下输入:"
    f_echo 33 "sh git_upload_to_svn.sh <git_url> <git.user> <git_passwd> <sub_dir> <branch_name> <local_repo>"
    exit 1
fi

# 判断是否是合法的 Git 地址
if ! [[ $1 == *.git ]]; then
    f_echo 31 "无效 Git 地址." && exit 1
fi


# 创建本地仓库目录并进入
LOCAL_REPO="$6"

if [ ! -d "$LOCAL_REPO" ]; then
  mkdir -p "$LOCAL_REPO"
fi

cd "$LOCAL_REPO" || { f_echo 31 "无法进入目录: $LOCAL_REPO"; exit 1; }

# 如果没有.git文件就先创建
if [ ! -d ".git" ]; then
  git init
fi
# 构造带认证的 Git 地址（替换 @ 为 %40）
RAW_USERNAME="$2"
URL_USERNAME="${RAW_USERNAME//@/%40}"
CLONE_URL="http://${URL_USERNAME}:${3}@${1#*//}"

git remote add origin "$CLONE_URL"

# 获取指定分支
git fetch origin "$5" || { f_echo 31 "Git fetch 失败，请检查网络、认证、分支是否存在"; exit 1; }

# 启用稀疏检出
git config core.sparsecheckout true
echo "$4" >> .git/info/sparse-checkout
echo "$4/*" >> .git/info/sparse-checkout
# 添加排除路径
echo "!02-nginx/" >> .git/info/sparse-checkout
echo "!01-clickhouse/" >> .git/info/sparse-checkout

# 检出指定目录
git checkout --force FETCH_HEAD || { f_echo 31 "Git checkout 失败，请检查路径是否正确"; exit 1; }

f_echo 36 "✅ Git 拉取完成，开始拉取SVN..."

# ================
# 以下为上传到 SVN 的部分
# ================
# SVN 配置
SVN_REPO="svn://192.168.2.20/dlmu-merge-publish"
SVN_TARGET_DIR="02-工程/00-出厂/01-设备程序/00-common-env"
SVN_USER="jenkins"
SVN_PASS="jenkins"
# 设置 SVN 本地工作目录
SVN_WORK_DIR="/data/transfer/local_svn_common_env_dir"
if [ ! -d "$SVN_WORK_DIR" ]; then
  mkdir -p "$SVN_WORK_DIR"
fi
cd "$SVN_WORK_DIR" || { f_echo 31 "无法进入 SVN 本地工作目录"; exit 1; }
# 如果没有.svn文件就checkout
if [ ! -d ".svn" ]; then
  f_echo 33 "检出 SVN 子目录仓库..."
  svn co "$SVN_REPO/$SVN_TARGET_DIR" . \
  --username="$SVN_USER" \
  --password="$SVN_PASS" \
  --non-interactive
fi

SVN_FILES=$(svn status | awk '$2 != "." {print $2}')
echo "SVN_FILES1: $SVN_FILES"

# 删除当前目录中所有内容，保留 .svn
shopt -s extglob

rm -rf !(.svn)

cp -rf /data/transfer/local_git_common_env_dir/02-非信创/00-common-env/* $SVN_WORK_DIR

# 删除本地没有的，远端svn有的
echo "SVN_FILES: $SVN_FILES"
LOCAL_FILES=$(ls -1)
echo "LOCAL_FILES: $LOCAL_FILES"
for FILE in $SVN_FILES; do
  svn delete "$FILE"
done


svn add . --force
svn commit -m "自动上传 Git 拉取内容" .


if [ $? -eq 0 ]; then
    f_echo 36 "✅ 成功提交到 SVN 服务器目录 $SVN_REPO/$SVN_TARGET_DIR！"
else
    f_echo 31 "❌ SVN 提交失败，请手动检查冲突或错误。"
    exit 1
fi